/*
 * Copyright 2017 Baiyyy
 * @(#)DeviceResponseHandle.java
 */

package com.byyy.ccts.modules.cc.handle.istr;

import com.byyy.ccts.core.utils.HexUtils;
import com.byyy.ccts.modules.cc.entity.ccts.TSDeviceOptCmd;
import com.byyy.ccts.modules.cc.entity.istr.CommRespMdl;
import com.byyy.ccts.modules.cc.entity.istr.InstructionMdl;
import com.byyy.ccts.modules.cc.service.IDeviceOptCmdService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 设备通用应答指令处理
 * Created by DELL on 2018-5-17.
 */
@Service("deviceRespIstrHdl")
public class DeviceRespIstrHdl extends IHandler {

    /** 设备通用应答指令Service */
    @Autowired
    private IDeviceOptCmdService deviceOptCmdService;

    /**
     * 设备通用应答指令处理
     * 1.校验(已提出共通)
     * 2.解析应答指令，不需要返回值
     * 3.查询正在执行中的指令，根据设备和指令获取，按时间升序
     * 4.如果存在多条正在执行中的指令，则判断流水号，查看当前指令是否第一个正在执行的，
     *   如果不是，说明前面的指令执行失败
     * 5.更新当前指令，以及前面指令的状态
     * @param instructions
     */
    @Override
    public byte[] handle(byte[] instructions) {
        logger.debug("设备通用应答指令开始处理");
        // 解析通用应答指令
        InstructionMdl istrMdl = this.generateInstructionModel(instructions);
        CommRespMdl commRespMdl = new CommRespMdl();
        commRespMdl.setDeviceId(istrMdl.getDeviceId());
        commRespMdl.setSequenceNum(istrMdl.getSequenceNum());

        byte responseCmd = instructions[22];
        commRespMdl.setResponseCmd(responseCmd);
        byte[] responseNum = new byte[7];
        for (int i = 0; i < responseNum.length; i++) {
            responseNum[i] = instructions[15 + i];
        }
        commRespMdl.setResponseNum(responseNum);

        // 查询正在执行中的指令，根据设备和指令获取，按时间升序
        List<TSDeviceOptCmd> taDeviceOptCmds = this.deviceOptCmdService.getDeviceOptCmd(
                HexUtils.bytesToHexFun3(istrMdl.getDeviceId()),
                HexUtils.bytesToHexFun3(new byte[]{responseCmd}), "2"
        );

        if (taDeviceOptCmds == null || taDeviceOptCmds.size() < 1) {
            return null;
        }

        TSDeviceOptCmd cmd = taDeviceOptCmds.get(0);
        String sequenceNum = HexUtils.bytesToHexFun3(responseNum);

        // 判断第一个流水号，更新指令状态
        if (sequenceNum.equals(cmd.getSequenceNum())) {
            // 执行成功
            cmd.setExecState("3");
            this.deviceOptCmdService.updateById(cmd);
            logger.debug("设备通用应答指令处理完毕");
            return null;
        }

        // 如果第一个流水号不是当前指令的，则将前面指令的状态置为失败，当前指令的置为成功
        for (int i = 0; i < taDeviceOptCmds.size(); i++) {
            cmd = taDeviceOptCmds.get(i);
            if (sequenceNum.equals(cmd.getSequenceNum())) {
                // 当前执行成功
                cmd.setExecState("3");
                this.deviceOptCmdService.updateBatchById(taDeviceOptCmds);
                logger.debug("设备通用应答指令处理完毕");
                return null;
            }
            else {
                // 前面指令执行失败
                cmd.setExecState("4");
            }
        }

        logger.debug("设备通用应答指令处理完毕");
        return null;
    }

}
